package modelo;

import controlador.Controlador;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import modelo.entidades.Entidad;
import modelo.persistencia.GenericDAO;

/**
 *
 * @author jjcamacho
 */
public abstract class AbstractModeloImp<C extends Controlador, T extends Entidad, K extends Serializable> implements Modelo<C, T, K> {

    private C controlador;

    @Override
    public C getController() {
        return controlador;
    }

    @Override
    public void setController(C controlador) {
        this.controlador = controlador;
    }

    @Override
    public void nuevaEntidad(T entidad) throws SQLException, Exception {
        GenericDAO dao = obtenerImplementacionDAO();
        dao.create(entidad);
        getController().fireDataModelChanged();
    }

    @Override
    public void actualizarEntidad(T entidad) throws SQLException, Exception {
        GenericDAO dao = obtenerImplementacionDAO();
        dao.update(entidad);
        getController().fireDataModelChanged();
    }

    @Override
    public void eliminarEntidad(T entidad) throws SQLException, Exception {
        GenericDAO dao = obtenerImplementacionDAO();
        dao.delete(entidad);
        getController().fireDataModelChanged();
    }

    @Override
    public List<T> listar() throws SQLException, Exception {
        GenericDAO dao = obtenerImplementacionDAO();
        return dao.list();
    }

 
    @Override
    public T obtenerEntidad(K pk) throws SQLException, Exception {
        GenericDAO dao = obtenerImplementacionDAO();
        return (T) dao.read(pk);
    }

    abstract GenericDAO obtenerImplementacionDAO();
}
